package org.mat.ipaas.ucenter.service.api.open;

import com.alibaba.fastjson.JSONObject;
import org.mat.framework.lang.dto.MatApiResponse;
import org.mat.ipaas.ucenter.service.dto.open.DataLogDTO;
import org.mat.ipaas.ucenter.service.dto.open.OnlineAuthDTO;
import org.mat.ipaas.ucenter.service.dto.open.message.*;
import org.mat.ipaas.ucenter.service.dto.system.vo.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * 服务化 system模块 对外接口请求类
 */
@FeignClient(name = "mat-ipaas-ucenter-service",contextId = "system-api-rest-api")
public interface SystemApiRestAPI {

    /**
     * 发送系统消息
     * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息
     */
    @PostMapping("/sys/api/sendSysAnnouncement")
    void sendSysAnnouncement(@RequestBody MessageDTO message);

    /**
     * 发送消息 附带业务参数
     * @param message 使用构造器赋值参数
     */
    @PostMapping("/sys/api/sendBusAnnouncement")
    void sendBusAnnouncement(@RequestBody BusMessageDTO message);

    /**
     * 通过模板发送消息
     * @param message 使用构造器赋值参数
     */
    @PostMapping("/sys/api/sendTemplateAnnouncement")
    void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message);

    /**
     * 通过模板发送消息 附带业务参数
     * @param message 使用构造器赋值参数
     */
    @PostMapping("/sys/api/sendBusTemplateAnnouncement")
    void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message);

    /**
     * 通过消息中心模板，生成推送内容
     * @param templateDTO 使用构造器赋值参数
     * @return
     */
    @PostMapping("/sys/api/parseTemplateByCode")
    String parseTemplateByCode(@RequestBody TemplateDTO templateDTO);

    /**
     * 根据业务类型busType及业务busId修改消息已读
     */
    @GetMapping("/sys/api/updateSysAnnounReadFlag")
    void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId") String busId);

    /**
     * 根据用户账号查询用户信息
     * @param username
     * @return
     */
    @GetMapping("/sys/api/getUserByName")
    LoginUserDTO getUserByName(@RequestParam("username") String username);

    /**
     * 根据用户id查询用户信息
     * @param id
     * @return
     */
    @GetMapping("/sys/api/getUserById")
    LoginUserDTO getUserById(@RequestParam("id") String id);

    /**
     * 通过用户账号查询角色集合
     * @param username
     * @return
     */
    @GetMapping("/sys/api/getRolesByUsername")
    List<String> getRolesByUsername(@RequestParam("username") String username);

    /**
     * 通过用户账号查询部门集合
     * @param username
     * @return 部门 id
     */
    @GetMapping("/sys/api/getDepartIdsByUsername")
    List<String> getDepartIdsByUsername(@RequestParam("username") String username);

    /**
     * 通过用户账号查询部门 name
     * @param username
     * @return 部门 name
     */
    @GetMapping("/sys/api/getDepartNamesByUsername")
    List<String> getDepartNamesByUsername(@RequestParam("username") String username);


    /**
     * 获取数据字典
     * @param code
     * @return
     */
    @GetMapping("/sys/api/queryDictItemsByCode")
    List<DictModelDTO> queryDictItemsByCode(@RequestParam("code") String code);

    /**
     * 获取有效的数据字典
     * @param code
     * @return
     */
    @GetMapping("/sys/api/queryEnableDictItemsByCode")
    List<DictModelDTO> queryEnableDictItemsByCode(@RequestParam("code") String code);


    /** 查询所有的父级字典，按照create_time排序 */
    @GetMapping("/sys/api/queryAllDict")
    List<DictModelDTO> queryAllDict();

    /**
     * 查询所有分类字典
     * @return
     */
    @GetMapping("/sys/api/queryAllSysCategory")
    List<SysCategoryModelDTO> queryAllSysCategory();


    /**
     * 查询所有部门 作为字典信息 id -->value,departName -->text
     * @return
     */
    @GetMapping("/sys/api/queryAllDepartBackDictModel")
    List<DictModelDTO> queryAllDepartBackDictModel();

    /**
     * 获取所有角色 带参
     * roleIds 默认选中角色
     * @return
     */
    @GetMapping("/sys/api/queryAllRole")
    List<ComboModelDTO> queryAllRole(@RequestParam(name = "roleIds", required = false) String[] roleIds);

    /**
     * 通过用户账号查询角色Id集合
     * @param username
     * @return
     */
    @GetMapping("/sys/api/getRoleIdsByUsername")
    List<String> getRoleIdsByUsername(@RequestParam("username") String username);

    /**
     * 通过部门编号查询部门id
     * @param orgCode
     * @return
     */
    @GetMapping("/sys/api/getDepartIdsByOrgCode")
    String getDepartIdsByOrgCode(@RequestParam("orgCode") String orgCode);

    /**
     * 查询所有部门
     * @return
     */
    @GetMapping("/sys/api/getAllSysDepart")
    List<SysDepartModelDTO> getAllSysDepart();

    /**
     * 根据 id 查询数据库中存储的 DynamicDataSourceModel
     *
     * @param dbSourceId
     * @return
     */
    @GetMapping("/sys/api/getDynamicDbSourceById")
    DynamicDataSourceModelDTO getDynamicDbSourceById(@RequestParam("dbSourceId")String dbSourceId);


    /**
     * 根据部门Id获取部门负责人
     * @param deptId
     * @return
     */
    @GetMapping("/sys/api/getDeptHeadByDepId")
    List<String> getDeptHeadByDepId(@RequestParam("deptId") String deptId);

    /**
     * 查找父级部门
     * @param departId
     * @return
     */
    @GetMapping("/sys/api/getParentDepartId")
    DictModelDTO getParentDepartId(@RequestParam("departId") String departId);

    /**
     * 根据 code 查询数据库中存储的 DynamicDataSourceModel
     *
     * @param dbSourceCode
     * @return
     */
    @GetMapping("/sys/api/getDynamicDbSourceByCode")
    DynamicDataSourceModelDTO getDynamicDbSourceByCode(@RequestParam("dbSourceCode") String dbSourceCode);

    /**
     * 给指定用户发消息
     * @param userIds
     * @param cmd
     */
    @GetMapping("/sys/api/sendWebSocketMsg")
    void sendWebSocketMsg(@RequestParam("userIds") String[] userIds, @RequestParam("cmd") String cmd);


    /**
     * 根据id获取所有参与用户
     * userIds
     * @return
     */
    @GetMapping("/sys/api/queryAllUserByIds")
    List<LoginUserDTO> queryAllUserByIds(@RequestParam("userIds") String[] userIds);

    /**
     * 查询所有用户 返回ComboModel
     * @return
     */
    @GetMapping("/sys/api/queryAllUserBackCombo")
    List<ComboModelDTO> queryAllUserBackCombo();

    /**
     * 分页查询用户 返回JSONObject
     * @return
     */
    @GetMapping("/sys/api/queryAllUser")
    JSONObject queryAllUser(@RequestParam(name = "userIds", required = false) String userIds, @RequestParam(name = "pageNo", required = false) Integer pageNo, @RequestParam(name = "pageSize", required = false) int pageSize);


    /**
     * 将会议签到信息推动到预览
     * userIds
     * @return
     * @param userId
     */
    @GetMapping("/sys/api/meetingSignWebsocket")
    void meetingSignWebsocket(@RequestParam("userId") String userId);

    /**
     * 根据name获取所有参与用户
     * userNames
     * @return
     */
    @GetMapping("/sys/api/queryUserByNames")
    List<LoginUserDTO> queryUserByNames(@RequestParam("userNames") String[] userNames);

    /**
     * 获取用户的角色集合
     * @param username
     * @return
     */
    @GetMapping("/sys/api/getUserRoleSet")
    Set<String> getUserRoleSet(@RequestParam("username") String username);

    /**
     * 获取用户的权限集合
     * @param username
     * @return
     */
    @GetMapping("/sys/api/getUserPermissionSet")
    Set<String> getUserPermissionSet(@RequestParam("username") String username);

    //-----

    /**
     * 判断是否有online访问的权限
     * @param onlineAuthDTO
     * @return
     */
    @PostMapping("/sys/api/hasOnlineAuth")
    boolean hasOnlineAuth(@RequestBody OnlineAuthDTO onlineAuthDTO);

    /**
     * 查询用户角色信息
     * @param username
     * @return
     */
    @GetMapping("/sys/api/queryUserRoles")
    Set<String> queryUserRoles(@RequestParam("username") String username);


    /**
     * 查询用户权限信息
     * @param username
     * @return
     */
    @GetMapping("/sys/api/queryUserAuths")
    Set<String> queryUserAuths(@RequestParam("username") String username);

    /**
     * 通过部门id获取部门全部信息
     */
    @GetMapping("/sys/api/selectAllById")
    SysDepartModelDTO selectAllById(@RequestParam("id") String id);

    /**
     * 根据用户id查询用户所属公司下所有用户ids
     * @param userId
     * @return
     */
    @GetMapping("/sys/api/queryDeptUsersByUserId")
    List<String> queryDeptUsersByUserId(@RequestParam("userId") String userId);


    /**
     * 查询数据权限
     * @return
     */
    @GetMapping("/sys/api/queryPermissionDataRule")
    List<SysPermissionDataRuleModelDTO> queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath") String requestPath, @RequestParam("username") String username);

    /**
     * 查询用户信息
     * @param username
     * @return
     */
    @GetMapping("/sys/api/getCacheUser")
    SysUserCacheInfoDTO getCacheUser(@RequestParam("username") String username);

    /**
     * 普通字典的翻译
     * @param code
     * @param key
     * @return
     */
    @GetMapping("/sys/api/translateDict")
    String translateDict(@RequestParam("code") String code, @RequestParam("key") String key);


    /**
     * 36根据多个用户账号(逗号分隔)，查询返回多个用户信息
     * @param usernames
     * @return
     */
    @RequestMapping("/sys/api/queryUsersByUsernames")
    List<JSONObject> queryUsersByUsernames(@RequestParam("usernames") String usernames);

    /**
     * 37根据多个用户id(逗号分隔)，查询返回多个用户信息
     * @param ids
     * @return
     */
    @RequestMapping("/sys/api/queryUsersByIds")
    List<JSONObject> queryUsersByIds(@RequestParam("ids") String ids);

    /**
     * 38根据多个部门编码(逗号分隔)，查询返回多个部门信息
     * @param orgCodes
     * @return
     */
    @GetMapping("/sys/api/queryDepartsByOrgcodes")
    List<JSONObject> queryDepartsByOrgcodes(@RequestParam("orgCodes") String orgCodes);

    /**
     * 39根据多个部门ID(逗号分隔)，查询返回多个部门信息
     * @param ids
     * @return
     */
    @GetMapping("/sys/api/queryDepartsByIds")
    List<JSONObject> queryDepartsByIds(@RequestParam("ids") String ids);

    /**
     * 40发送邮件消息
     * @param email
     * @param title
     * @param content
     */
    @GetMapping("/sys/api/sendEmailMsg")
    void sendEmailMsg(@RequestParam("email") String email, @RequestParam("title") String title, @RequestParam("content") String content);

    /**
     * 41 获取公司下级部门和公司下所有用户信息
     * @param orgCode
     */
    @GetMapping("/sys/api/getDeptUserByOrgCode")
    List<Map> getDeptUserByOrgCode(@RequestParam("orgCode")String orgCode);

    /**
     * 查询分类字典翻译
     *
     * @param ids 分类字典表id
     * @return
     */
    @GetMapping("/sys/api/loadCategoryDictItem")
    List<String> loadCategoryDictItem(@RequestParam("ids") String ids);

    /**
     * 根据字典code加载字典text
     *
     * @param dictCode 顺序：tableName,text,code
     * @param keys     要查询的key
     * @return
     */
    @GetMapping("/sys/api/loadDictItem")
    List<String> loadDictItem(@RequestParam("dictCode") String dictCode, @RequestParam("keys") String keys);

    /**
     * 根据字典code查询字典项
     *
     * @param dictCode 顺序：tableName,text,code
     * @param dictCode 要查询的key
     * @return
     */
    @GetMapping("/sys/api/getDictItems")
    List<DictModelDTO> getDictItems(@RequestParam("dictCode") String dictCode);

    /**
     * 根据多个字典code查询多个字典项
     *
     * @param dictCodeList
     * @return key = dictCode ； value=对应的字典项
     */
    @RequestMapping("/sys/api/getManyDictItems")
    Map<String, ?> getManyDictItems(@RequestParam("dictCodeList") List<String> dictCodeList);

    /**
     * 【下拉搜索】
     * 大数据量的字典表 走异步加载，即前端输入内容过滤数据
     *
     * @param dictCode 字典code格式：table,text,code
     * @param keyword  过滤关键字
     * @return
     */
    @GetMapping("/sys/api/loadDictItemByKeyword")
    List<DictModelDTO> loadDictItemByKeyword(@RequestParam("dictCode") String dictCode, @RequestParam("keyword") String keyword, @RequestParam(value = "pageSize", required = false) Integer pageSize);

    /**
     * 48 普通字典的翻译，根据多个dictCode和多条数据，多个以逗号分割
     * @param dictCodes
     * @param keys
     * @return
     */
    @GetMapping("/sys/api/translateManyDict")
    Map<String, ?> translateManyDict(@RequestParam("dictCodes") String dictCodes, @RequestParam("keys") String keys);


    /**
     * 获取表数据字典 【接口签名验证】
     * @param table
     * @param text
     * @param code
     * @return
     */
    @GetMapping("/sys/api/queryTableDictItemsByCode")
    List<DictModelDTO> queryTableDictItemsByCode(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code);

    /**
     * 查询表字典 支持过滤数据 【接口签名验证】
     * @param table
     * @param text
     * @param code
     * @param filterSql
     * @return
     */
    @GetMapping("/sys/api/queryFilterTableDictInfo")
    List<DictModelDTO> queryFilterTableDictInfo(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("filterSql") String filterSql);

    /**
     * 【接口签名验证】
     * 查询指定table的 text code 获取字典，包含text和value
     * @param table
     * @param text
     * @param code
     * @param keyArray
     * @return
     */
    @Deprecated
    @GetMapping("/sys/api/queryTableDictByKeys")
    List<String> queryTableDictByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keyArray") String[] keyArray);


    /**
     * 字典表的 翻译【接口签名验证】
     * @param table
     * @param text
     * @param code
     * @param key
     * @return
     */
    @GetMapping("/sys/api/translateDictFromTable")
    String translateDictFromTable(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("key") String key);


    /**
     * 【接口签名验证】
     * 49 字典表的 翻译，可批量
     *
     * @param table
     * @param text
     * @param code
     * @param keys  多个用逗号分割
     * @return
     */
    @GetMapping("/sys/api/translateDictFromTableByKeys")
    List<DictModelDTO> translateDictFromTableByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keys") String keys);

    /**
     * 发送模板信息
     * @param message
     */
    @PostMapping("/sys/api/sendTemplateMessage")
    void sendTemplateMessage(@RequestBody MessageDTO message);

    /**
     * 获取消息模板内容
     * @param code
     * @return
     */
    @GetMapping("/sys/api/getTemplateContent")
    String getTemplateContent(@RequestParam("code") String code);

    /**
     * 保存数据日志
     * @param dataLogDto
     */
    @PostMapping("/sys/api/saveDataLog")
    void saveDataLog(@RequestBody DataLogDTO dataLogDto);

    @PostMapping("/sys/api/addSysFiles")
    void addSysFiles(@RequestBody SysFilesModelDTO sysFilesModel);

    @GetMapping("/sys/api/getFileUrl")
    String getFileUrl(@RequestParam(name = "fileId") String fileId);

    /**
     * 更新头像
     * @param loginUserDTO
     * @return
     */
    @PutMapping("/sys/api/updateAvatar")
    void updateAvatar(@RequestBody LoginUserDTO loginUserDTO);

    /**
     * 向app端 websocket推送聊天刷新消息
     * @param userId
     * @return
     */
    @GetMapping("/sys/api/sendAppChatSocket")
    void sendAppChatSocket(@RequestParam(name = "userId") String userId);

}
